www.gusucode.com > Weighted Differential Evolution Algorithm (WDE) > Weighted Differential Evolution Algorithm (WDE)/cc_wde/affine_transform/my_affine_transform.m
%{ % problem : Geometric Optimization ; Evolutionary-Adjustment based Coordinate Transformation by using Affine-Model load('affine_data.mat') a=mydata.a; b=mydata.b % unbounded search gives more accurate results ! algo_wde('my_affine_transform',mydata, 5, 4, [0 0 0 0], [2*pi 1 1 1], 50000); [out,t,x0,y0,b0] = my_affine_transform(globalminimizer,mydata); % b0 is transfered-a data into b-system err=b0-b; mse(err) %} function [out,t,x0,y0,A_transformed_to_B] = my_affine_transform(X,mydata) A = mydata.a; % xyz B = mydata.b; % xyz n = size(X,1); out = rand(n,1); for i = 1:n sol = X(i,:); t = sol(1); lambda1 = sol(2); a = lambda1 * sin(t); b = lambda1 * cos(t); x0 = sol(3); % dX y0 = sol(4); % dY r = [ a -b 0; b a 0; 0 0 1 ]; % ref : https://www.mathworks.com/help/phased/ref/rotz.html?requestedDomain=true t = atan(b/a)*180/pi; % returns the numerical value of rotation angle around the z-axis in right-hand system. % rotate % translate A_transformed_to_B = A * r ; % transform A -> B A_transformed_to_B(:,1) = A_transformed_to_B(:,1) + x0; A_transformed_to_B(:,2) = A_transformed_to_B(:,2) + y0; err = abs( A_transformed_to_B(:,1:2) - B(:,1:2) ); out(i) = sum(err(:)); % MAE end